

let Role = {
    Red:1,
    Blue:2,
};

// function minmax(role,depth) {
//     if(role === Role.Red){
//         return max(depth);
//     }else{
//         return min(depth);
//     }
// }
//
// function max(depth) {
//     let best = -Infinity;
//     if(depth <= 0){
//         return evaluate();
//     }
//
//     //
//     genMove();
//     let val;
//     while (movesLeft()){
//         makeNextMove();
//         val = min(depth - 1);
//         unmakeMove();
//         if(val > best){
//             best = val;
//         }
//     }
//     return best;
// }
//
// function min(depth) {
//     let best = Infinity;
//     if(depth <= 0){
//         return evaluate();
//     }
//     genMove();
//     let val;
//     while (movesLeft()){
//         makeNextMove();
//         val = max(depth - 1);
//         unmakeMove();
//         if(val < best){
//             best = val;
//         }
//     }
//     return best;
// }
//
// // 评估盘面得分
// function evaluate() {
//
// }
//
// function genMove() {
//
// }
//
// function movesLeft() {
//
// }
// function makeNextMove() {
//
// }
// function unmakeMove() {
//
// }


// function minimax(node, depth) // 指定当前节点和搜索深度
// // 如果能得到确定的结果或者深度为零，使用评估函数返回局面得分
// if node is a terminal node or depth = 0
// return the heuristic value of node
// // 如果轮到对手走棋，是极小节点，选择一个得分最小的走法
// if the adversary is to play at node
// let α := +∞
//        foreach child of node
// α := min(α, minimax(child, depth-1))
// // 如果轮到我们走棋，是极大节点，选择一个得分最大的走法
// else {we are to play at node}
// let α := -∞
//        foreach child of node
// α := max(α, minimax(child, depth-1))
// return α;



function aiSearch(board,depth) {
    let emptyCells = board.emptyCells();

    if(emptyCells.length < 1){
        throw new Error('没有空位置');
    }

    let best = -Infinity;
    let dstCell;
    for(let i = 0; i < emptyCells.length;++i){
        let c = emptyCells[i];
        c.value = 2; //  填满此位置
        let v = max(board,depth - 1,c);
        c.value = 0; // 还原
        if(v > best){
            best = v;
            dstCell = c;
        }
    }
    return dstCell;
}

function evaluate(board,c) {
    // 评估2
    // row
    return board.aiEvaluate(c);
}

function min(board,depth,c) {
    if(depth < 1){
        return evaluate(board,c);
    }

    let best = -Infinity;
    let dstCell = null;
    let emptyCells = board.emptyCells();
    for(let i = 0; i < emptyCells.length;++i){
        let c = emptyCells[i];
        c.value = 2;
        let v = max(board,depth - 1,c);
        c.value = 0;
        if(v > best){
            best = v;
            dstCell = c;
        }
    }
    return dstCell;
}

function max(board,depth,c) {
    if(depth < 1){
        return evaluate(board,c);
    }
    let best = Infinity;
    let dstCell = null;
    let emptyCells = board.emptyCells();
    for(let i = 0; i < emptyCells.length;++i){
        let c = emptyCells[i];
        c.value = 1;  // 模拟对手下
        let v = min(board,depth - 1,c);
        c.value = 0; // 还原
        if(v < best){
            best = v;
            dstCell = c;
        }
    }
    return dstCell;
}



